MFCC

计算梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients)。

\[MFCC_i = f(Input_i)\]
输入:
  • mfcc_params - MFCC 计算相关的配置参数,如采样率、梅尔滤波器数量等。

  • spec_params - 频谱计算参数,定义了FFT窗口大小、重叠长度等。

  • mfcc_workspace - 工作空间参数,包括计算所需的中间缓冲区。

  • spec_workspace - 频谱计算的工作空间,包括FFT的窗口、输入数据等。

  • core_mask (可选) - 核掩码(仅适用于多核版本)。

输出:
  • output(mfcc_params中) - 计算结果地址,存储MFCC特征。

  • output_shape(mfcc_params中) - 输出数据的形状,描述MFCC特征的维度。

结构体定义:
 1    typedef struct {
 2        // 输入/输出
 3        float* input;           // 输入数据地址
 4        int* input_shape;       // 输入数据形状
 5        float* output;          // 输出数据地址
 6        int* output_shape;      // 输出数据形状
 7
 8        // 配置参数
 9        int sample_rate;        // 采样率
10        int n_mfcc;            // MFCC系数数量
11        int dct_type;           // DCT变换类型
12        bool log_mels;          // 是否对梅尔频谱取对数
13        float f_min;            // 最小频率
14        float f_max;            // 最大频率
15        int n_mels;             // 梅尔滤波器数量
16        NormType norm;          // 归一化类型
17        NormMode norm_M;        // 归一化模式
18        MelType mel_scale;      // 梅尔尺度类型
19    } MfccParam;
20
21    typedef struct {
22        // 输入
23        float* input;           // 输入数据地址
24        int input_len;          // 输入数据长度
25
26        // 输出
27        float* output;          // 输出数据地址
28        int* output_shape;      // 输出数据形状
29
30        // 配置参数
31        int pad;                // 填充大小
32        WindowType window_type; // 窗函数类型
33        int n_fft;              // FFT点数
34        int hop_length;         // 帧移长度
35        int win_length;         // 窗长度
36        float power;            // 功率值
37        bool normalized;        // 是否归一化
38        bool center;            // 是否中心化
39        BorderType pad_mode;    // 填充模式
40        bool onesided;          // 是否单边频谱
41    } SpectrogramParam;
42
43    typedef struct {
44        // 滤波器组计算缓冲区
45        float *all_freqs;       // 所有频率点
46        float *m_pts;           // 梅尔频率点
47        float *f_pts;           // 线性频率点
48        float *fb;              // 滤波器组
49
50        // 三角滤波器计算缓冲区
51        float *f_diff;          // 频率差值
52        float *slopes;          // 斜率
53        float *down_slopes;     // 下降斜率
54        float *up_slopes;       // 上升斜率
55
56        // DCT变换缓冲区
57        float* dct_mat;         // DCT矩阵
58
59        // 中间结果缓冲区
60        float* spectrogram_output;          // 频谱图输出
61        float* mel_spectrogram_output;      // 梅尔频谱输出
62    } MfccWorkspaceParam;
63
64    typedef struct {
65        float* fft_window;          // FFT窗函数缓冲区
66        float* fft_window_later;    // 后续FFT窗缓冲区
67        float* input_data_pad;      // 填充后的输入数据
68        float* input_data;          // 输入数据缓冲区
69        float* input_win;           // 加窗输入数据
70        float* exp_complex;         // 复数指数缓冲区
71        float* spec_f;              // 频谱频率缓冲区
72        float* output_onsided;      // 单边输出缓冲区
73    } WorkspaceParam;
支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32

  • MT7004 支持 fp32, fp16

共享存储版本:

void fp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)
void hp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3
 4int main(int argc, char* argv[]) {
 5    float* input_data = (float*)0x81000000;
 6    float* output_mfcc = (float*)0x82000000;
 7    int input_shape[2] = {1, 4000};
 8    int output_shape[2] = {0, 0, 0};
 9    MfccParam* mfcc_params = (MfccParam*)0x83100000;
10    SpectrogramParam* spec_params = (SpectrogramParam*)0x83200000;
11    MfccWorkspaceParam* mfcc_workspace = (MfccWorkspaceParam*)0x83300000;
12    WorkspaceParam* spec_workspace = (WorkspaceParam*)0x83400000;
13
14    mfcc_params->input = input_data;
15    mfcc_params->input_shape = input_shape;
16    mfcc_params->output = output_mfcc;
17    mfcc_params->output_shape = output_shape;
18    mfcc_params->sample_rate = 800;
19    mfcc_params->n_mfcc = 6;
20    mfcc_params->dct_type = 2;
21    mfcc_params->log_mels = true;
22    mfcc_params->f_min = 0.0f;
23    mfcc_params->f_max = 400.0f;
24    mfcc_params->n_mels = 8;
25    mfcc_params->norm = NORM_SLANEY;
26    mfcc_params->norm_M = NORM_MODE_ORTHO;
27    mfcc_params->mel_scale = MEL_HTK;
28
29    // 结构体 2: SpectrogramParam
30    spec_params->pad = 0;
31    spec_params->window_type = kHann;
32    spec_params->n_fft = 32;
33    spec_params->hop_length = 16;
34    spec_params->win_length = 32;
35    spec_params->power = 2.0f;
36    spec_params->normalized = false;
37    spec_params->center = false;
38    spec_params->pad_mode = kConstant;
39    spec_params->onesided = true;
40
41    int core_mask = 0xff;
42    //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址
43    //...
44
45    fp_mfcc_s(mfcc_params, spec_params, mfcc_workspace, spec_workspace, core_mask);
46    return 0;
47}

私有存储版本:

void fp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)
void hp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3
 4int main(int argc, char* argv[]) {
 5    MfccParam mfcc_params;
 6    SpectrogramParam spec_params;
 7    MfccWorkspaceParam mfcc_workspace;
 8    WorkspaceParam spec_workspace;
 9
10    float* input_data = (float*)0x10810000;
11    float* output_mfcc = (float*)0x10820000;
12    int input_shape[2] = {1, 4000};
13    int output_shape[2] = {0, 0, 0};
14
15    mfcc_params.input = input_data;
16    mfcc_params.input_shape = input_shape;
17    mfcc_params.output = output_mfcc;
18    mfcc_params.output_shape = output_shape;
19    mfcc_params.sample_rate = 800;
20    mfcc_params.n_mfcc = 6;
21    mfcc_params.dct_type = 2;
22    mfcc_params.log_mels = true;
23    mfcc_params.f_min = 0.0f;
24    mfcc_params.f_max = 400.0f;
25    mfcc_params.n_mels = 8;
26    mfcc_params.norm = NORM_SLANEY;
27    mfcc_params.norm_M = NORM_MODE_ORTHO;
28    mfcc_params.mel_scale = MEL_HTK;
29
30    // 结构体 2: SpectrogramParam
31    spec_params.pad = 0;
32    spec_params.window_type = kHann;
33    spec_params.n_fft = 32;
34    spec_params.hop_length = 16;
35    spec_params.win_length = 32;
36    spec_params.power = 2.0f;
37    spec_params.normalized = false;
38    spec_params.center = false;
39    spec_params.pad_mode = kConstant;
40    spec_params.onesided = true;
41
42    //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址
43    //...
44
45    fp_mfcc_p(&mfcc_params, &spec_params, &mfcc_workspace, &spec_workspace);
46    return 0;
47}